package br.com.usapre.faces;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import br.com.business.CartaoBusiness;
import br.com.business.GrauParentescoBusiness;
import br.com.business.StatusCartaoBusiness;
import br.com.business.TipoCartaoBusiness;
import br.com.data.Cartao;
import br.com.data.GrauParentesco;
import br.com.login.faces.SessionUsaPreBean;
import br.com.utilidades.database.data.Criterio;
import br.com.utilidades.faces.SimpleMessageBean;

/**
 * @version 1.0.0
 * @since Fevereiro,28 2013
 * @author Eduardo Francisco Barbosa
 */
@Component
@Scope("view")
public class CartaoAdicionalBean extends SimpleMessageBean implements Serializable {

    private static final long serialVersionUID = 3621043664831261807L;

    private SessionUsaPreBean sessionUsaPreBean;

    private Cartao cartaoAdicional;
    private Cartao cartaoSelecionado;

    private String nomeCompleto;

    private List<Cartao> cartoesUsuario;
    private List<Cartao> cartoesAdicionais;

    private List<GrauParentesco> grauParentencos;
    private GrauParentesco grauParentesco;

    private CartaoBusiness cartaoBusinessImpl;
    private GrauParentescoBusiness grauParentescoBusinessImpl;
    private StatusCartaoBusiness statusCartaoBusinessImpl;
    private TipoCartaoBusiness tipoCartaoBusinessImpl;

    /**
     * Construtor
     */
    @Autowired
    public CartaoAdicionalBean(SessionUsaPreBean sessionUsaPreBean, CartaoBusiness cartaoBusinessImpl,
	    GrauParentescoBusiness grauParentescoBusinessImpl, StatusCartaoBusiness statusCartaoBusinessImpl,
	    TipoCartaoBusiness tipoCartaoBusinessImpl) {

	this.sessionUsaPreBean = sessionUsaPreBean;

	this.cartaoBusinessImpl = cartaoBusinessImpl;
	this.grauParentescoBusinessImpl = grauParentescoBusinessImpl;
	this.statusCartaoBusinessImpl = statusCartaoBusinessImpl;
	this.tipoCartaoBusinessImpl = tipoCartaoBusinessImpl;

	reset();
    }

    /**
     * reset
     */
    public void reset() {
	cartaoAdicional = new Cartao();

	// busca os cartoes do usuario logado
	cartoesUsuario = cartaoBusinessImpl.buscarCartoesPorUsuario(sessionUsaPreBean.getUsuario());

	cartoesAdicionais = new ArrayList<Cartao>();

	if (cartoesUsuario.size() == 1) {
	    cartaoSelecionado = cartoesUsuario.get(0);
	}
	if (cartoesUsuario.size() > 1) {
	    for (Cartao cartao : cartoesUsuario) {
		if (cartao.getAdicional().equals(Boolean.FALSE)) {
		    cartaoSelecionado = cartao;
		} else {
		    cartoesAdicionais.add(cartao);
		}
	    }
	}
	if (cartoesUsuario.size() == 0) {
	    cartaoSelecionado = null;
	    String usuarioNaoTemCartao = super.getMensagem("MN_usuario_nao_tem_cartao_vinculado");
	    enviaMensagem(usuarioNaoTemCartao, usuarioNaoTemCartao);
	}

	grauParentencos = grauParentescoBusinessImpl.buscarPorCriterios(new ArrayList<Criterio>(), "");
	grauParentesco = null;

	cartaoAdicional = new Cartao();

    }

    /**
     * solicitar
     */
    public void solicitar() {

	cartaoAdicional.setGrauParentesco(grauParentesco);
	cartaoAdicional.setAdicional(Boolean.TRUE);

	// STATUS DO CARTAO SOLICITADO
	cartaoAdicional.setStatusCartao(statusCartaoBusinessImpl.buscarPorId(2));

	// TIPO DO CARTAO PREPAGO
	cartaoAdicional.setTipoCartao(tipoCartaoBusinessImpl.buscarPorId(3));

	cartaoAdicional.setUsuario(cartaoSelecionado.getUsuario());

	// cartaoBusinessImpl.salvar(cartaoAdicional);

	String cartaoSolicitado = super.getMensagem("MN_cartao_solicitado_sucesso");
	enviaMensagem(cartaoSolicitado, cartaoSolicitado);

    }

    // SETS AND GETS
    public Cartao getCartaoAdicional() {
	return cartaoAdicional;
    }

    public void setCartaoAdicional(Cartao cartaoAdicional) {
	this.cartaoAdicional = cartaoAdicional;
    }

    public Cartao getCartaoSelecionado() {
	return cartaoSelecionado;
    }

    public void setCartaoSelecionado(Cartao cartaoSelecionado) {
	this.cartaoSelecionado = cartaoSelecionado;
    }

    public List<GrauParentesco> getGrauParentencos() {
	return grauParentencos;
    }

    public void setGrauParentencos(List<GrauParentesco> grauParentencos) {
	this.grauParentencos = grauParentencos;
    }

    public GrauParentesco getGrauParentesco() {
	return grauParentesco;
    }

    public void setGrauParentesco(GrauParentesco grauParentesco) {
	this.grauParentesco = grauParentesco;
    }

    public String getNomeCompleto() {
	return nomeCompleto;
    }

    public void setNomeCompleto(String nomeCompleto) {
	this.nomeCompleto = nomeCompleto;
    }

}
